# -*- coding: utf-8 -*-

# @author Anderson R. Livramento
# Copyright (C) 2008 Anderson Rodrigues Livramento <anderdevel@users.sourceforge.net>
#
# O conteúdo deste arquivo está disponível dentro dos termos 
# da Licença Pública Geral GNU como publicada pela 
# Fundação do Software Livre (FSF); na versão 2 da Licença, ou
# (na sua opnião) qualquer versão mais recente.
#
# Este programa é distribuído na esperança que possa ser útil,
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a
# qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob
# o título "LICENCA.txt", junto com este programa; se não, escreva para
# a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301  US
#
import formencode
import sqlalchemy.types

VALIDATOR_TYPES ={
    sqlalchemy.types.Integer: formencode.validators.Int,
    sqlalchemy.types.SmallInteger: formencode.validators.Int,
    sqlalchemy.types.String: formencode.validators.String,
    sqlalchemy.types.Unicode: formencode.validators.String,
    sqlalchemy.types.Date: formencode.validators.DateConverter,
    sqlalchemy.types.Numeric: formencode.validators.Number
}

DATE_STYLE = 'dd/mm/yyyy'

class BaseFormValidator(formencode.Schema):
    allow_extra_fields = True
    filter_extra_fields = True

class UsuarioForm(BaseFormValidator):
    mapper_class = 'Usuario'
    
    def __init__(self):
        self.metadata = {'nmlogin':'Usuário','desenha':'Senha'}

class MostraForm(BaseFormValidator):
    mapper_class = 'Mostra'
    
    def __init__(self):
        self.metadata = {'nmmostra':'Nome'}

class CandidatoForm(BaseFormValidator):
    mapper_class = 'Candidato'
    
    def __init__(self):
        self.metadata = {'idcandidato':'Código','nmcandidato':'Nome'}

class VotacaoForm(BaseFormValidator):
    mapper_class = 'Votacao'
    
    def __init__(self):
        self.metadata = {'cdmostra':'Mostra'}


def form_mapper(FormClass,MappedClass,**kw):
    if MappedClass:
        form_fields = {}
        for column in MappedClass.c:
            validator_params = {}
            if not column.nullable and not column.primary_key:
                validator_params['not_empty'] = True
            else:
                validator_params['not_empty'] = False
                
            if type(column.type) == sqlalchemy.types.Date:
                validator_params['month_style'] = DATE_STYLE
                
            form_fields[column.name] = VALIDATOR_TYPES[type(column.type)](**validator_params)
            
        setattr(FormClass,'fields',form_fields)
        
def get_errors(error_dict,FormInstance):
    error_message = '%s: %s'
    form_errors = {}
    if hasattr(FormInstance,'metadata'):
        for field in error_dict:
            field_label = ''
            if FormInstance.metadata.has_key(field):
                field_label = FormInstance.metadata[field].decode('utf-8')
            else:
                field_label = field
            form_errors[field] = error_message %(field_label,str(error_dict[field]))
    return form_errors

